package cn.itsource.itsource.service.impl;

//import cn.itsource.itsource.config.alipay.AlipayService;
import cn.itsource.itsource.config.alipay.AlipayService;
import cn.itsource.itsource.domain.OrderAddress;
import cn.itsource.itsource.domain.OrderAdopt;
import cn.itsource.itsource.domain.Pet;
import cn.itsource.itsource.mapper.OrderAddressMapper;
import cn.itsource.itsource.mapper.OrderAdoptMapper;
import cn.itsource.itsource.mapper.PetMapper;
import cn.itsource.itsource.service.IOrderAdoptService;
import cn.itsource.itsource.util.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.Date;

@Service
@Transactional
public class OrderAdoptServiceImpl implements IOrderAdoptService {
    @Autowired
    private OrderAdoptMapper orderAdoptMapper;

    @Autowired
    private OrderAddressMapper orderAddressMapper;

    @Autowired
    private PetMapper petMapper;

    @Autowired //注入调用支付宝支付的业务方法
    private AlipayService alipayService;


    @Override
    public AjaxResult submitOrder(OrderAdopt orderAdopt) {
        //所有操作前，需要进行校验
        //1. 非空校验
        //2. 支付金额校验（后台需要再重新 计算一遍，如果后台计算的价格与前端计算的价格不匹配，无法保存订单）
        //3. 关联的宠物的信息也要校验（价格）


        //1. 先保存到订单地址表
        OrderAddress orderAddress = new OrderAddress();
        orderAddress.setFullAddress(orderAdopt.getUserAddress().getFullAddress());
        orderAddress.setPhone(orderAdopt.getUserAddress().getPhone());
        orderAddress.setCreateTime(new Date());
        //如果添加操作后，需要立马得到当前添加数据的 自增长主键，需要添加一个注解
        //@GeneratedValue(strategy = GenerationType.IDENTITY)
        orderAddressMapper.insert(orderAddress);
        //2.再保存到宠物领养订单表
        //TODO 核心点：将这个表中各种需要初始化的字段找到并赋值
        orderAdopt.setAddressId(orderAddress.getId());
        //user_id已经在controller中获取到了
        //shop_id 这个值是根据pet_id查询宠物信息后，获取的
        Pet pet = petMapper.selectByPrimaryKey(orderAdopt.getPetId());
        orderAdopt.setShopId(pet.getShopId());

        //其他的默认值
        orderAdopt.setState(0);//默认为【未支付】
        //生成一个订单编号
        orderAdopt.setOrderSn(System.currentTimeMillis() + "");
        //添加提交时间
        orderAdopt.setLastConfirmTime(new Date());

        orderAdoptMapper.insert(orderAdopt);

        //3. 调用支付宝的支付接口
        //TODO 将每个商户对应的支付宝支付的核心参数，放到数据库中保存时
        //TODO 那么在调用支付接口时，就需要根据shop_id到 t_pay_alipay_info 查出对应的参数数据，再调用支付
       //
        String payUrl = alipayService.createPayUrl(orderAdopt.getPrice(), orderAdopt.getDigest(), orderAdopt.getOrderSn(),pet.getShopId());


        return AjaxResult.success("操作成功").setData(payUrl);
    }

    @Override
    public void paySuccessOfUpdateOrderState(String out_trade_no, String trade_no) {
        Example example = new Example(OrderAdopt.class);
        example.and().andEqualTo("orderSn", out_trade_no);
        //根据订单号只可能查出一条数据或0条数据
        OrderAdopt orderAdopt = orderAdoptMapper.selectOneByExample(example);
        //更新订单的相关支付参数
        orderAdopt.setPaySn(trade_no);
        orderAdopt.setLastPayTime(new Date());
        orderAdopt.setState(1);//更新为【已支付】
        orderAdoptMapper.updateByPrimaryKeySelective(orderAdopt);
    }


}
